const { spawn } = require("child_process");


//终端启动 node client.js  然后 再启动server.js
//
// 启动 server.js 子进程
const serverProcess = spawn("node", ["server.js"]); // node server.js

// 监听服务端的响应
// 数据是哪个进程给我的？
// 我这个进程又将数据输出到了哪个进程？

// serverProcess 监听 server 子进程 发过来的消息
serverProcess.stdout.on("data", (data) => {
  // 子 子监听用 out 发送消息用in

  // process 代表父进程 此时的 父进程是 终端进程 向终端输出
  process.stdin.write(data.toString()); // 🙋 往哪里输出？ 输出  是终端进程 发送给终端
});

// 发送几条测试消息
const messages = ["生命有意义吗？", "宇宙有尽头吗？", "再见！"];

messages.forEach((msg, index) => {
  setTimeout(() => {
    console.log(`-->${msg}`);
    serverProcess.stdin.write(msg); // 向  server.js 子进程 发送消息
  }, index * 1000); // 每秒发一条
});

// in：输入
// out：输出


// ‌为什么有时混用？‌

// ‌进程角色不同‌：主进程用stdout发送，子进程用stdin接收（反之亦然）
// ‌协议设计差异‌：某些工具（如child_process.exec）默认通过stdout传递结果，而spawn可自由配置管道
// ‌历史原因‌：早期Node版本IPC实现方式不同
// ‌通用原则‌：

// text
// Copy Code
// 发送数据 → stdout/stderr
// 接收数据 → stdin
// ‌经典示例对比‌：

// 命令行交互程序：
// javascript
// Copy Code
// // 接收用户输入（stdin）
// process.stdin.on('data', (data) => {
//   // 处理数据后输出（stdout）
//   process.stdout.write(`ECHO: ${data}`);
// });
// 进程间通信：
// javascript
// Copy Code
// // 父进程（发送端）
// const { spawn } = require('child_process');
// const child = spawn('node', ['child.js']);
// child.stdout.on('data', (data) => {
//   console.log(`子进程输出: ${data}`);
// });

// // 子进程（接收端）
// process.stdin.on('data', (data) => {
//   process.stdout.write(`处理结果: ${data.toString().toUpperCase()}`);
// });
// ‌特殊注意事项‌：

// 在child_process.fork()中会建立额外的IPC通道，此时通常不使用标准流
// 流式数据处理时建议用pipe()直接连接（如process.stdin.pipe(transformStream).pipe(process.stdout)）
